
package com.ezlcp.user.controller;

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.ezlcp.commons.base.db.BaseService;
import com.ezlcp.commons.base.entity.JsonResult;
import com.ezlcp.commons.tool.StringUtils;
import com.ezlcp.commons.utils.ContextUtil;
import com.ezlcp.user.entity.SerialNo;
import com.ezlcp.user.service.SerialNoServiceImpl;
import com.ezlcp.user.web.BaseController;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Slf4j
@RestController
@RequestMapping("/ezlcp/user/serialNo")
@Tag(name = "流水单（单据编号）管理")
public class SerialNoController extends BaseController<SerialNo> {
    @Autowired
    SerialNoServiceImpl serialNoService;

    @Operation(summary = "生成单据编码，目前改为后端调用，前端可以先不管")
    @GetMapping(value = "genSerialNo")
    public JsonResult genSerialNo(@Parameter(description = "单据类型") @RequestParam(value = "orderType") String orderType) {
        if (StringUtils.isEmpty(ContextUtil.getCurrentTenantId())) {
            return JsonResult.Fail("common.isUserNot");
        }
        if (StringUtils.isEmpty(orderType)) {
            return JsonResult.Fail("menu.paramError");
        }
        String serialNo = serialNoService.getSerialNo(orderType);
        return JsonResult.getSuccessResult(serialNo, "common.handleSuccess");
    }

    @Operation(summary="a.获取当前公司的单据编号配置")
    @GetMapping(value = "getCurTenant")
    public JsonResult getCurrentTenant() {
        String tenantId = ContextUtil.getCurrentTenantId();
        if (StringUtils.isEmpty(tenantId)) {
            return JsonResult.Fail("common.isUserNot");
        }
        JsonResult result = JsonResult.Success("common.handleSuccess");
        List<SerialNo> list = serialNoService.getByTenant(tenantId);
        result.setData(list);
        result.setShow(false);
        return result;
    }

    @Operation(summary = "b.批量保存配置", description = "请求参数格式：{\n" +
            "<br>    \"tenantId\": \"1\",\n" +
            "<br>    \"data\": [\n" +
            "<br>        {\n" +
            "<br>            \"id\": 1,\n" +
            "<br>            \"rules\": \"1\",\n" +
            "<br>            \"currentVal\": \"1\",\n" +
            "<br>            \"...\": \"1\",\n" +
            "<br>            \"step\": \"1\"\n" +
            "<br>        } ]\n" +
            "<br>}" +
            "<br>tenantId为公司ID，data为单据编号对a象数组\" +")
    @PostMapping("/batchSave")
    public JsonResult batchSave(@RequestBody JSONObject object) {
        String tenantId = object.getString("tenantId");
        JSONArray data = object.getJSONArray("data");
        if (StringUtils.isEmpty(tenantId) || !tenantId.equals(ContextUtil.getCurrentTenantId()) ||
                data == null) {
            return JsonResult.Fail("menu.paramError");
        }
        JsonResult result = JsonResult.Success("menu.success");
        serialNoService.batchUpdate(data);
        return result;
    }

    @Operation(summary="c.获取规则的详细介绍")
    @GetMapping(value = "getRuleHelp")
    public JsonResult getRuleHelp() {
        String help = "{yyyy}:4位数的年份，如2022年，\n" + "{yy}:两位数的年份，如22年；\n" +
                "{MM}:两位数的月份，如01月，\n" + "{mm}:正常的月份，前面不补0，如1月；\n" +
                "{DD}:两位数的日，如08日，\n" + "{dd}:正常的日，前面不补0，如8日；\n" +
                "{NO}:指定长度的编号，如0002，\n" + "{no}:正常编号，前面不补0，如2；\n" +
                "{yyyyMM}:固定6位长度的年月，如202203；\n" +
                "{yyyyMMDD}:固定8位长度的年月日，如20220606。\n" +
                "按天重置流水号，占位符中要有{DD}或{dd};\n" +
                "按月重置，要有{MM}或{mm};按年重置，要有{yyyy}或{yy}";
        String help2 = "{yyyy}:4位数的年份，如2022年，\n<br>" + "{yy}:两位数的年份，如22年；\n<br>" +
                "{MM}:两位数的月份，如01月，\n<br>" + "{mm}:正常的月份，前面不补0，如1月；\n<br>" +
                "{DD}:两位数的日，如08日，\n<br>" + "{dd}:正常的日，前面不补0，如8日；\n<br>" +
                "{NO}:指定长度的编号，如0002，\n<br>" + "{no}:正常编号，前面不补0，如2；\n<br>" +
                "{yyyyMM}:固定6位长度的年月，如202203；\n<br>" +
                "{yyyyMMDD}:固定8位长度的年月日，如20220606。\n<br>" +
                "按天重置流水号，占位符中要有{DD}或{dd};\n<br>" +
                "按月重置，要有{MM}或{mm};按年重置，要有{yyyy}或{yy}";
        return JsonResult.getSuccessResult(help2, help);
    }

    @Operation(summary = "d.校验规则", description = "传入实体对象")
    @PostMapping(value = "validRule")
    public JsonResult validRule(@RequestBody SerialNo serialNo) {
        if (serialNo == null) {
            return JsonResult.Fail("menu.paramError");
        }
        return serialNoService.validRule(serialNo);
    }

    @Operation(summary = "e.单条记录保存")
    @Override
    @PostMapping("/save")
    public JsonResult save(@RequestBody SerialNo entity, BindingResult validResult) throws Exception {
        if (entity == null) {
            return JsonResult.Fail("menu.paramError");
        }
        JsonResult result = serialNoService.validRule(entity);
        if (!result.isSuccess()) {
            return result;
        }
        return super.save(entity, validResult);
    }

    @Operation(summary = "默认删除方法已关闭")
    @Override
    public JsonResult del(@RequestParam(value = "ids") String ids) {
        return null;
    }
    @Override
    public BaseService getBaseService() {
        return serialNoService;
    }

    @Override
    public String getComment() {
        return "单据编号，系统初始化公司ID为空的记录，每个公司创建后从初始记录复制";
    }
}